package org.example.controller;

import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import lombok.extern.slf4j.Slf4j;
import org.example.pojo.Result;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * cookie和session的使用
 * 1. cookie
 *      1.1 服务器响应给客户端cookie
 *      1.2 客户端浏览器保存cookie
 *      1.3 客户端每次请求都带上cookie
 *      1.4 服务器端解析cookie
 * - 优点：HTTP协议中支持的技术（像Set-Cookie 响应头的解析以及 Cookie 请求头数据的携带，都是浏览器自动进行的，是无需我们手动操作的）
 * - 缺点：
 *   - 移动端APP(Android、IOS)中无法使用Cookie
 *   - 不安全，用户可以自己禁用Cookie
 *   - Cookie不能跨域
 * 2. session
 *      2.1 服务器创建session对象，同时生成一个JSESSIONID的cookie响应给客户端
 *      2.2 客户端浏览器保存JSESSIONID
 *      2.3 客户端每次请求都带上JSESSIONID
 *      2.4 服务器端根据JSESSIONID查找对应的session对象
 *      2.5 如果没有对应的session对象，就会创建一个新的session对象
 *      2.6 如果有对应的session对象，就会使用对应的session对象
 * - 优点：Session是存储在服务端的，安全
 * - 缺点：
 *   - 服务器集群环境下无法直接使用Session
 *   - 移动端APP(Android、IOS)中无法使用Cookie
 *   - 用户可以自己禁用Cookie
 *   - Cookie不能跨域
 * PS：Session 底层是基于Cookie实现的会话跟踪，如果Cookie不可用，则该方案，也就失效了。
 */
@Slf4j
@RestController
public class SessionController {

    //设置Cookie
    @GetMapping("/c1")
    public Result cookie1(HttpServletResponse response){
        response.addCookie(new Cookie("login_username","itheima")); //设置Cookie/响应Cookie
        return Result.success();
    }

    //获取Cookie
    @GetMapping("/c2")
    public Result cookie2(HttpServletRequest request){
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            if(cookie.getName().equals("login_username")){
                System.out.println("login_username: "+cookie.getValue()); //输出name为login_username的cookie
            }
        }
        return Result.success();
    }
    @GetMapping("/s1")
    public Result session1(HttpSession session){
        log.info("HttpSession-s1: {}", session.hashCode());

        session.setAttribute("loginUser", "tom"); //往session中存储数据
        return Result.success();
    }

    @GetMapping("/s2")
    public Result session2(HttpServletRequest request){
        HttpSession session = request.getSession();
        log.info("HttpSession-s2: {}", session.hashCode());

        Object loginUser = session.getAttribute("loginUser"); //从session中获取数据
        log.info("loginUser: {}", loginUser);
        return Result.success(loginUser);
    }
}
